iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
Python

進擊的Python系列 第 27

Day24-Matplotlib(格達)

  • 分享至 

  • xImage
  •  

大家好!我是格達~我分享Matplotlib

https://ithelp.ithome.com.tw/upload/images/20240824/20163257OHyZLs6oxG.png
圖片來源:(https://shingekinokyojin.fandom.com/zh/wiki/%E6%A0%BC%E9%81%94%C2%B7%E4%BF%AE%E8%8C%B2)

Matplotlib

https://ithelp.ithome.com.tw/upload/images/20240824/20163257NAwM25qeIu.png
圖片來源:(https://steam.oxxostudio.tw/category/python/example/matplotlib.html)

Python一個強大繪圖庫,能夠生成多種靜態、動畫圖表,並且可以將圖表嵌入到使用通用 GUI 工具包(Tkinter、 wxPython、Qt、GTK)應用程式中。提供一個類似 MATLAB 接口,方便使用者快速繪製出各種專業級的圖形

安裝Matplotlib

使用 pip 安裝

pip install matplotlib

使用 Anaconda 安裝

如果使用 Anaconda 或 Miniconda,可以直接在 Anaconda Prompt 中執行

conda install -c conda-forge matplotlib

matplotlib 圖表設定

圖形整體風格

  • 風格套用:Matplotlib提供多種預設的風格,快速改變圖形的整體樣式
import matplotlib.pyplot as plt

plt.style.use('ggplot')  # 套用 ggplot 風格

圖形元素設定

標題軸標籤

plt.title('我的圖形標題', fontsize=20, fontweight='bold')
plt.xlabel('X軸標籤')
plt.ylabel('Y軸標籤')

刻度

plt.xticks(ticks=[1, 2, 3, 4], labels=['A', 'B', 'C', 'D'])
plt.yticks(np.arange(0, 11, 2))

網格線

plt.grid(True)

圖例

plt.plot(x, y, label='線性')
plt.legend()

顏色線型標記

plt.plot(x, y, color='red', linestyle='--', marker='o')

軸範圍

plt.xlim(0, 10)
plt.ylim(-1, 1)

建立子圖

plt.subplot(2, 2, 1)  # 分割成 2x2 的子圖,選擇第一個

調整子圖間距

plt.subplots_adjust(hspace=0.3, wspace=0.2)

其他常見設定

圖形大小

plt.figure(figsize=(8, 6))

背景顏色

plt.figure(facecolor='lightgray')

保存圖形

plt.savefig('my_plot.png', dpi=300)

客製化散佈圖

import matplotlib.pyplot as plt
import numpy as np

# 創建隨機數據
x = np.random.rand(100)
y = np.random.rand(100)

# 繪製散佈圖
plt.scatter(x, y, s=50, c='blue', marker='^', alpha=0.7)

# 設定圖形標題和軸標籤
plt.title('隨機散佈圖', fontsize=16)
plt.xlabel('X軸')
plt.ylabel('Y軸')

# 設定網格線
plt.grid(True, linestyle='--', alpha=0.5)

# 設定圖形大小和背景顏色
plt.figure(figsize=(8, 6), facecolor='lightgray')

# 顯示圖形
plt.show()

matplotlib 圖表類型

基本圖形

折線圖 (Line Plot)

顯示數據隨時間或類別的變化趨勢

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.plot(x, y)
plt.show()

散佈圖(Scatter Plot)

顯示兩個變數之間的關係

plt.scatter(x, y)
plt.show()

常用圖形

柱狀圖(Bar Chart)

比較不同類別的數值大小

plt.bar(['A', 'B', 'C'], [3, 8, 1])
plt.show()

直方圖(Histogram)

顯示數據的分佈情況

data = np.random.randn(1000)
plt.hist(data, bins=30)
plt.show()

餅圖(Pie Chart)

顯示部分佔整體比例

plt.pie([25, 25, 50])
plt.show()

箱型圖(Box Plot)

顯示一組數據的分佈情況,包括中位數、四分位數、異常值

plt.boxplot(data)
plt.show()

進階圖形

等高線圖(Contour Plot)

顯示三維數據在二維平面上投影

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3, 3, 256)
y = np.linspace(-3, 3, 256)
X, Y = np.meshgrid(x, y)
Z = np.sin(X**2 + Y**2)

plt.contour(X, Y, Z)
plt.show()

熱圖(Heatmap)

顯示二維數據的數值大小,通常用顏色表示

import seaborn as sns  # Seaborn 是建立在 Matplotlib 上的視覺化庫,提供更豐富的圖形
sns.heatmap(data)
plt.show()

3D圖形

Matplotlib也能繪製簡單3D圖形

from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# ... 繪製 3D 圖形
plt.show()
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.show()
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 尋找系統中可用的中文字體
font_properties = fm.FontProperties(fname="C:/Windows/Fonts/simhei.ttf")  # 替換為你的字體路徑

# 繪製簡單的線性圖
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.xlabel('X軸', fontproperties=font_properties)
plt.ylabel('Y軸', fontproperties=font_properties)
plt.title('簡單線性圖', fontproperties=font_properties)
plt.show()

程式碼說明

  • 導入模組
    • matplotlib.pyplot:提供繪圖功能
    • matplotlib.font_manager:用於管理字體
  • 尋找字體
    • fm.FontProperties:創建字體屬性對象
    • fname:指定字體文件路徑
  • 繪製圖形
    • plt.plot(x, y):繪製線性圖
  • 設置標籤和標題
    • xlabel, ylabel, title:設置各個軸的標籤和圖表的標題
    • fontproperties: 將字體屬性應用於文本
  • 字體管理:可以使用 font_manager 模組查詢系統中所有可用字體,並根據需要進行選擇

常見問題與解決方案

  • 中文顯示亂碼
    • 檢查字體路徑是否正確
    • 確保字體文件可讀
    • 嘗試不同的字體
  • 部分文字顯示不完整
    • 調整字體大小或行距
    • 檢查文本內容是否過長
  • 圖表保存時中文顯示異常
    • 嘗試不同的圖像格式(SVG)
    • 確保保存時字體嵌入正確

結論

Matplotlib 是一個功能強大的 Python 繪圖庫,能夠生成美觀且具有資訊性的圖表。透過正確設定字體,可以輕鬆地在圖表中顯示中文。希望介紹能幫助快速上手 Matplotlib,並製作出精美的中文圖表

特別作戰里維班:謝謝里維兵長

里維:謝謝你們

https://ithelp.ithome.com.tw/upload/images/20240904/20163257ohaG3Sp09l.jpg
圖片來源:(https://zh.moegirl.org.cn/zh-hk/%E8%B0%83%E6%9F%A5%E5%85%B5%E5%9B%A2%E7%89%B9%E5%88%AB%E4%BD%9C%E6%88%98%E5%B0%8F%E7%BB%84#/media/File:%E7%89%B9%E5%88%AB%E4%BD%9C%E6%88%98%E5%B0%8F%E7%BB%84.jpeg)


上一篇
Day23-Flask與Django(艾魯多)
下一篇
Day25-SciPy(艾爾文)
系列文
進擊的Python36
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言